import dayjs from 'dayjs';
import utc from 'dayjs/plugin/utc';
import timezone from 'dayjs/plugin/timezone';

// 启用 day.js 的 UTC 和时区插件
dayjs.extend(utc);
dayjs.extend(timezone);

class DateUtils {
    /**
     * 解析时间字符串为 day.js 对象
     * @param {string} dateStr - ISO 8601 格式时间字符串（如 '2022-01-04T14:17:28.000+00:00'）
     * @returns {Object} day.js 对象
     */
    static parse(dateStr) {
        return dayjs(dateStr);
    }

    /**
     * 格式化时间为指定格式
     * @param {string} dateStr - ISO 8601 格式时间字符串
     * @param {string} format - 格式化模板（默认 'YYYY-MM-DD HH:mm:ss'）
     * @param {boolean} isLocal - 是否转换为本地时间（默认 false，保持原始时区）
     * @returns {string} 格式化后的时间字符串
     */
    static format(dateStr, format = 'YYYY-MM-DD HH:mm:ss', isLocal = false) {
        const date = isLocal ? dayjs(dateStr).local() : dayjs(dateStr);
        return date.isValid() ? date.format(format) : 'Invalid Date';
    }

    /**
     * 转换为指定时区并格式化
     * @param {string} dateStr - ISO 8601 格式时间字符串
     * @param {string} timezone - 目标时区（如 'Asia/Shanghai'）
     * @param {string} format - 格式化模板（默认 'YYYY-MM-DD HH:mm:ss'）
     * @returns {string} 格式化后的时间字符串
     */
    static toTimezone(dateStr, timezone, format = 'YYYY-MM-DD HH:mm:ss') {
        const date = dayjs(dateStr).tz(timezone);
        return date.isValid() ? date.format(format) : 'Invalid Date';
    }

    /**
     * 计算两个时间之间的差值
     * @param {string} dateStr1 - 第一个时间字符串（ISO 8601 格式）
     * @param {string} dateStr2 - 第二个时间字符串（默认当前时间）
     * @param {string} unit - 单位（'day', 'hour', 'minute', 'second' 等，默认 'day'）
     * @returns {number} 时间差值
     */
    static diff(dateStr1, dateStr2 = dayjs(), unit = 'day') {
        const date1 = dayjs(dateStr1);
        const date2 = dayjs(dateStr2);
        return date1.isValid() && date2.isValid() ? date2.diff(date1, unit) : NaN;
    }

    /**
     * 获取当前时间（支持时区）
     * @param {string} timezone - 可选时区（默认使用系统时区）
     * @param {string} format - 格式化模板（默认 'YYYY-MM-DD HH:mm:ss'）
     * @returns {string} 当前时间的格式化字符串
     */
    static now(timezone = null, format = 'YYYY-MM-DD HH:mm:ss') {
        return timezone ? dayjs().tz(timezone).format(format) : dayjs().format(format);
    }

    /**
     * 检查时间字符串是否有效
     * @param {string} dateStr - 时间字符串
     * @returns {boolean} 是否有效
     */
    static isValid(dateStr) {
        return dayjs(dateStr).isValid();
    }
}

export default DateUtils;